<?php

    require_once(dirname(__FILE__).'/../../globals.inc');
    
    $mikron->Page->StartBody();

    function stripdots($buf)
    {
        $pos = strpos($buf, ":");
        if(!($pos===false))
        {
            return trim(substr($buf, $pos + 1));
        }
    }

    function ParseWebMoney($email, $signature, $preparse = false)
    {
        /*
        global $mikron;
        $body = $email->body->value;
        $pos = strpos($body, $signature);
        $data = substr($body, $pos + strlen($signature));
        $data = str_replace("\n", " ", $data);
        $tp = split(" ", $data);
        $wmid = str_replace("\r", null, $tp[11]);
        $amount = (float)$tp[7] * 100;
        $dt = $tp[2]." ".$tp[3];
        try
        {
            $wmid2 = quote_smart($wmid);
            if($preparse)
            {
                $cond = "`wmid`=$wmid2 AND `status` = 1";
            }
            else
            {
                $cond = "`wmid`=$wmid2 AND `status` = 5";
            }
            $orders = $mikron->Queries->Query("T_ORDER", null, $cond);
            $email->amount->value = $amount;
            $email->wmid->value = $wmid;
            if($orders->count() == 0)
            {
                // Письмо с платежем от WebMoney № $email->id никто не заказывал
                $email->state->value = 77; // ошибка
                $email->Save();
                return true;
            }
            else
            {
                $amountfloored = floor($amount);
                $order = $orders->fetch();
                $cabinet = $order->cabinet->value;
                if(is_object($cabinet))
                {
                    $email->cabinet->value = $cabinet->id;
                    if($preparse)
                    {   // предварительная обработка
                        $email->state->value = 5; // в обработке
                        $amounterror = $amountfloored != $order->amount->value;
                        $email->amounterror->value = $amounterror?1:0; // ошибка суммы
                        $order->status->value = 5; // в обработке
                        $email->orderlink->value = $order->id;
                        $mikron->EntityManager->Save(Array($email, $order));
                        echo "Обнаружена WebMoney оплата на сумму $amountfloored от $dt<br />";
                    }
                    else
                    {
                        // проводка письма
                        $email->state->value = 2; // Webmoney
                        $order->status->value = 2; // закрыт
                        $foplog = ChangeCabinetBalance($cabinet, 4, $amountfloored, 0, 0, 0, 0);
                        OperationLogEcp($foplog, $cabinet);
                        $saved_items = Array();
                        $saved_items[] = $cabinet;
                        $referal = $cabinet->referal->value;
                        if(is_object($referal))
                        {
                            $foplog_referal = ChangeCabinetBalance($referal, 7, $amountfloored * 0.1, 0, 0, 0, 0);
                            $foplog_referal->partner->value = $cabinet->id;
                            OperationLogEcp($foplog_referal, $referal);
                            $saved_items[] = $referal;
                            $saved_items[] = $foplog_referal;
                        }
                        $saved_items[] = $email;
                        $saved_items[] = $foplog;
                        $saved_items[] = $order;
                        $mikron->EntityManager->Save($saved_items);
                        echo "Произведено начисление по WebMoney на сумму $amount от $dt<br />";
                    }
                    return true;
                }
            }
        }
        catch(Exception $ex)
        {
            CriticalError($ex->getMessage());
        }
        */
    }

    function ParseSMSPartner($email)
    {
        global $mikron;
        $body = $email->body->value;
        $struct = fetch_structure($body);
        $header = $struct['header'];
        $headers = decode_header($header);
        $subject = $headers['subject'];    
        $text = $struct['body'];
        $text = compile_body($text,$headers["content-transfer-encoding"],$headers["content-type"]);
        $text2 = strip_tags($text); //trim(decode_mime_string($headers['subject']));
        $tp = split("\n", $text2);
        $dt = trim($tp[0]);
        $phonenumber = trim($tp[1]);
        $login = trim($tp[2]);
        $dt = stripdots($dt);
        $login = stripdots($login);
        $phonenumber = stripdots($phonenumber);        
        $login2 = quote_smart($login);
        $email->phonenumber->value = $phonenumber;
        $email->operationdate->value = $dt;
        $email->subject->value = decode_mime_string($headers['subject']);
        $cab = $mikron->Queries->Query('T_USER', null, new Criterion('login', $login));
        if($cab->count())
        {
            $cab = $cab->fetch();
            $email->cabinet->value = $cab->id;
            $email->state->value = 3;
            $amount = 0;
            $platinum = 0;
            $gold = 0;
            $silver = 0;
            $bronze = 0;
            $saved_items = Array();
            $referal = $cab->referal->value;
            $foplog_referal = null;
            switch($email->subject->value)
            {
                case '"Оплата "Серебрянного шанса"':
                    $silver = 1;
                    $bronze = 1;
                    if(is_object($referal))
                    {
                        $foplog_referal = ChangeCabinetBalance($referal, 7, 10, 0, 0, 0, 0);
                    }
                    break;
                case 'Оплата "Золотого шанса"':
                    $gold = 1;
                    $bronze = 100;
                    if(is_object($referal))
                    {
                        $foplog_referal = ChangeCabinetBalance($referal, 7, 100, 0, 0, 0, 0);
                    }
                    break;
                case 'Оплата "Платинового шанса"':
                    $platinum = 1;
                    $bronze = 500;
                    if(is_object($referal))
                    {
                        $foplog_referal = ChangeCabinetBalance($referal, 7, 1000, 0, 0, 0, 0);
                    }
                    break;
            }
            $oplog = ChangeCabinetBalance($cab, 3, $amount, $platinum, $gold, $silver, $bronze);
            OperationLogEcp($oplog, $cab);
            $saved_items[] = $email;
            $saved_items[] = $cab;
            if(is_object($referal) && !is_null($foplog_referal))
            {
                $foplog_referal->partner->value = $cab->id;
                OperationLogEcp($foplog_referal, $referal);
                $saved_items[] = $referal;
                $saved_items[] = $foplog_referal;
            }
            $saved_items[] = $oplog;
            $mikron->EntityManager->Save($saved_items);
            echo 'Обнаружена SMS оплата ('.$email->subject->value.") от $dt с телефона $phonenumber<br />";
        }
    }

    ?><h1>Проверка электронных ящиков:</h1><?php

    $h = fopen(dirname(__FILE__).'/cron.txt', 'a');
    fwrite($h, date("d-m-Y H:i:s")." check emailboxes \r\n");
    fclose($h);

    // чтение ящика /////////////////
    $emailboxes = $mikron->Queries->Query('T_EMAILBOX');
    
    $newemails = 0;
    while($emailbox = $emailboxes->fetch())
    {
        $server = $emailbox->server->value;
        $port = $emailbox->port->value;
        $email = $emailbox->email->value;
        $login = $emailbox->login->value;
        $password = $emailbox->password->value;
        $pop_conn = fsockopen($server, $port, $errno, $errstr, 2);
        // Проверка ящика $email
        if($errno != 0)
        {
           echo "Ошибка #$errno: ".$errstr; 
           ?><hr /><?php
        }
        else
        {
            $gets = get_data($pop_conn);
            $answer = Array();
            $answer = explode(" ", $gets);
            $answer[0] = strtoupper($answer[0]);
            if($answer[0] == "+OK")
            {
                $commands[] = "USER $login";
                $commands[] = "PASS $password";
                $commands[] = "STAT";
                foreach($commands as $popcommand)
                {
                    fputs($pop_conn, $popcommand."\r\n");
                    $gets = get_data($pop_conn);
                    $answer = explode(" ", $gets);
                    $answer[0] = strtoupper($answer[0]);
                    if($answer[0] != "+OK")
                    {
                        break;
                    }
                }
                if($answer[0] == "+OK")
                {
                    $gets = null;
                    $count = (int)$answer[1];
                    for($i = 1; $i <= $count; $i++)
                    {
                        fputs($pop_conn,"RETR $i\r\n");
                        $body = get_data($pop_conn, true);
                        {
                            if(substr($body, 0, 3) == "+OK")
                            {
                                if(substr($body, -1, 1) == ".")
                                {
                                    try
                                    {
                                        // добавление письма в админку проекта
                                        $letter = new T_MAIL();
                                        $letter->body->value = $body;
                                        $letter->mailbox->value = $emailbox->id;
                                        $letter->Save();
                                        // Удаление письма с сервера
                                        //fputs($pop_conn,"DELE $i\r\n");
                                        $gets = get_data($pop_conn);
                                        $newemails++;
                                    }
                                    catch(Exception $ex)
                                    {
                                        
                                    }
                                }
                            }
                        }
                    }
                }
                fputs($pop_conn, "QUIT\r\n");
            }
            else
            {
                echo join("<br />", $answer), "<br />";
            }
            echo $gets;
        }
        echo "Новых писем ";
        echo $newemails ? ": $newemails" : "нет";
        ?></div><?php
    }

// парсинг закачанных писем /////////////

    $parsers = Array();
    // $parsers[] = Array('signature' => "новые поступления на WM-идентификатор ", 'parser'=>"webmoney");
    $parsers[] = Array('signature' => "post@smspartner.ru", 'parser'=>"smspartner");
    $emails = $mikron->Queries->Query('T_MAIL', null, new Criterion('state', Array(1, 4), CR_IN));
    $webmoney_need_accept = Array();

    $h = fopen(dirname(__FILE__)."/cron.txt", "a");
    $cnt = count($emails);
    fwrite($h, date("d-m-Y H:i:s").$cnt."\r\n");
    fclose($h);

    while($email = $emails->fetch())
    {
        $body = $email->body->value;
        $parsed = false;
        $find = false;
        foreach($parsers as $parser)
        {
            $signature = $parser['signature'];
            $pos = strpos($body, $signature);
            $find = !($pos === false);
            if($find){break;}
        }
        if($find)
        {   // если подтвержденное письмо, то проводим его
            if($email->state->value == 4)
            {
                ParseWebMoney($email, $signature);
            }
            elseif($email->state->value == 1)
            {
                // если новое, до этого не обрабатывавшееся письмо
                switch($parser['parser'])
                {
                    case 'webmoney':
                        // предварительная обработка с целью вычитки данных кабинета и суммы
                        $webmoney_need_accept[] = $email->id;
                        ParseWebMoney($email, $signature, true);
                        $parsed = true;
                        break;
                    case 'smspartner':
                        // проводка письма в качестве СМС-оплаты
                        $parsed = true;
                        ParseSMSPartner($email);
                        break;
                }

                if(!$parsed)
                {
                    try
                    {
                        $email->state->value = 99;
                        $email->Save();
                    }
                    catch(Exception $ex)
                    {
                        CriticalError('Ошибка в файле '.__FILE__.' в строке '.__LINE__.', '.$ex->getMessage());
                    }
                }
            }
        }
    }

    /*
    новые поступления на WM-идентификатор 415758050717 :
    26.01.2009 13:52:14 поступление на сумму 9.9 WMR от корреспондента 502308514478
    Сервис WM-notify.
    */

function parsepacket($buffer)
{
    return substr($buffer, 4);
}

function instr($txt, $find)
{
    $pos = strpos($txt, $find);
    if($pos === false)
    {
        return false;
    }
    else
    {
        return true;
    }
}

function get_data($pop_conn, $multiline = false)
{
    if($multiline)
    {
        $data = "";
        $it = 0;
        while (!feof($pop_conn))
        {
            $buffer = chop(fgets($pop_conn, 512));
            
            if(trim($buffer) == ".")
            {
                $data .= "$buffer";
                break;
            }
            else
            {
                $data .= "$buffer\r\n";
            }
        }
        return $data;
    }
    else
    {
        return chop(fgets($pop_conn, 4096));
    }    
}


// При отправке почты, все не латинские символы в заголовках кодируется, 
// например тема письма может выглядеть так =?windows-1251?B?7/Du4uXw6uA=?= 
// вот такие тексты и будет преобразовывать эта функция
function decode_mime_string($subject)
{
    $string = $subject;
    if(($pos = strpos($string,"=?")) === false) return $string;
    while(!($pos === false))
    {
        $newresult .= substr($string,0,$pos);
        $string = substr($string,$pos+2,strlen($string));
        $intpos = strpos($string,"?");
        $charset = substr($string,0,$intpos);
        $enctype = strtolower(substr($string,$intpos+1,1));
        $string = substr($string,$intpos+3,strlen($string));
        $endpos = strpos($string,"?=");
        $mystring = substr($string,0,$endpos);
        $string = substr($string,$endpos+2,strlen($string));
        if($enctype == "q") $mystring = quoted_printable_decode(ereg_replace("_"," ",$mystring)); 
        else if ($enctype == "b") $mystring = base64_decode($mystring);
        $newresult .= $mystring;
        $pos = strpos($string,"=?");
    }
    $result = $newresult.$string;
    if(ereg("koi8", $subject)) $result = convert_cyr_string($result, "k", "w");
    if(ereg("KOI8", $subject)) $result = convert_cyr_string($result, "k", "w");
    return $result;
}

// перекодировщик тела письма. 
// Само письмо может быть закодировано и данная функция приводит тело письма в нормальный вид.
// Так же и вложенные файлы будут перекодироваться этой функцией. 
function compile_body($body,$enctype,$ctype)
{
    $enctype = explode(" ",$enctype); $enctype = $enctype[0];
    if(strtolower($enctype) == "base64")
    $body = base64_decode($body);
    elseif(strtolower($enctype) == "quoted-printable")
    $body = quoted_printable_decode($body);
    if(ereg("koi8", $ctype)) $body = convert_cyr_string($body, "k", "w");
    return $body;
}

// Функция для выдергивания метки boundary из заголовка Content-Type
// boundary это разделитель между разным содержимым в письме, 
// например, чтобы отделить файл от текста письма
function get_boundary($ctype)
{
    if(preg_match('/boundary[ ]?=[ ]?(["]?.*)/i',$ctype,$regs))
    {
        $boundary = preg_replace('/^\"(.*)\"$/', "\\1", $regs[1]);
        return trim("--$boundary");
    }
}

// если письмо будет состоять из нескольких частей (текст, файлы и т.д.)
// то эта функция разобьет такое письмо на части (в массив), согласно разделителю boundary
function split_parts($boundary,$body)
{
    $startpos = strpos($body,$boundary)+strlen($boundary)+2;
    $lenbody = strpos($body,"\r\n$boundary--") - $startpos;
    $body = substr($body,$startpos,$lenbody);
    return explode($boundary."\r\n",$body);
}

// Эта функция отделяет заголовки от тела.
// и возвращает массив с заголовками и телом
function fetch_structure($email)
{
    $ARemail = Array();
    $separador = "\r\n\r\n";
    $header = trim(substr($email,0,strpos($email,$separador)));
    $bodypos = strlen($header)+strlen($separador);
    $body = substr($email,$bodypos,strlen($email)-$bodypos);
    $ARemail["header"] = $header; 
    $ARemail["body"] = $body;
    return $ARemail;
}

// разбирает все заголовки и выводит массив, в котором каждый элемент является соответсвующим заголовком 
function decode_header($header)
{
    $headers = explode("\r\n",$header);
    $decodedheaders = Array();
    for($i=0;$i<count($headers);$i++)
    {
        $thisheader = trim($headers[$i]);
        if(!empty($thisheader))
        if(!ereg("^[A-Z0-9a-z_-]+:",$thisheader))
        {
            $decodedheaders[$lasthead] .= " $thisheader";
        }
        else
        {
            $dbpoint = strpos($thisheader,":");
            $headname = strtolower(substr($thisheader,0,$dbpoint));
            $headvalue = trim(substr($thisheader,$dbpoint+1));
            if($decodedheaders[$headname] != "") $decodedheaders[$headname] .= "; $headvalue";
            else $decodedheaders[$headname] = $headvalue;
            $lasthead = $headname;
        }
    }
    return $decodedheaders;
}

$mikron->Page->EndBody();

?>